package com.smart.community.user.service;

import com.smart.community.user.dto.UserPropertyCompanyDTO;
import com.smart.community.user.dto.UserPropertyCompanyQueryDTO;
import com.smart.community.user.vo.UserPropertyCompanyVO;
import com.smart.community.commons.result.PageResult;

import java.util.List;

/**
 * 用户物业公司关联服务接口
 * 
 * @author Wu.Liang
 */
public interface UserPropertyCompanyService {

    /**
     * 用户关联物业公司
     * 
     * @param userId 用户ID
     * @param companyId 物业公司ID
     * @throws Exception 统一异常
     */
    void associateUserWithCompany(Long userId, Long companyId) throws Exception;

    /**
     * 用户关联物业公司（完整信息）
     * 
     * @param userId 用户ID
     * @param companyId 物业公司ID
     * @param position 职位
     * @param department 部门
     * @param employeeNo 员工编号
     * @param joinDate 入职日期
     * @param remark 备注
     * @throws Exception 统一异常
     */
    void associateUserWithCompanyFull(Long userId, Long companyId, String position, 
                                    String department, String employeeNo, 
                                    java.time.LocalDate joinDate, String remark) throws Exception;

    /**
     * 解除用户物业公司关联
     * 
     * @param userId 用户ID
     * @param companyId 物业公司ID
     * @throws Exception 统一异常
     */
    void disassociateUserFromCompany(Long userId, Long companyId) throws Exception;

    /**
     * 查询用户关联的物业公司
     * 
     * @param userId 用户ID
     * @return 物业公司列表
     * @throws Exception 统一异常
     */
    List<UserPropertyCompanyVO> getUserPropertyCompanies(Long userId) throws Exception;

    /**
     * 获取用户关联的物业公司ID列表
     * 
     * @param userId 用户ID
     * @return 物业公司ID列表
     * @throws Exception 统一异常
     */
    List<Long> getUserCompanyIds(Long userId) throws Exception;

    /**
     * 批量关联用户与物业公司
     * 
     * @param userIds 用户ID列表
     * @param companyId 物业公司ID
     * @throws Exception 统一异常
     */
    void batchAssociateUsersWithCompany(List<Long> userIds, Long companyId) throws Exception;

    /**
     * 批量解除用户与物业公司关联
     * 
     * @param userIds 用户ID列表
     * @param companyId 物业公司ID
     * @throws Exception 统一异常
     */
    void batchDisassociateUsersFromCompany(List<Long> userIds, Long companyId) throws Exception;

    // 新增：分页查询用户物业公司列表
    PageResult<UserPropertyCompanyVO> getUserPropertyCompanyList(UserPropertyCompanyQueryDTO queryDTO) throws Exception;

    // 新增：根据ID查询用户物业公司
    UserPropertyCompanyVO getUserPropertyCompany(Long id) throws Exception;

    // 新增：新增用户物业公司
    void createUserPropertyCompany(UserPropertyCompanyDTO userPropertyCompanyDTO) throws Exception;

    // 新增：更新用户物业公司
    void updateUserPropertyCompany(Long id, UserPropertyCompanyDTO userPropertyCompanyDTO) throws Exception;

    // 新增：删除用户物业公司
    void deleteUserPropertyCompany(Long id) throws Exception;

    // 新增：更新用户物业公司状态
    void updateUserPropertyCompanyStatus(Long id, Integer status) throws Exception;

    // 新增：分配用户物业公司
    void assignUserPropertyCompanies(Long userId, List<Long> propertyCompanyIds) throws Exception;

    // 新增：获取物业公司关联的用户
    List<UserPropertyCompanyVO> getPropertyCompanyUsers(Long propertyCompanyId) throws Exception;
} 